賽前我最看好「固定字數+overlap」——教學文都說它是安全牌。實測結果:它墊底。更麻煩的是,三種切法的命中率看起來根本打平,直到我多算一個指標才拆穿假象:有一種切法的「命中」,其實 94% 是垃圾。
Day 8 的檢索能動是運氣:語料剛好一條規定一個主題、每條都短。今天把運氣拿掉——語料從 12 條擴成 11 章、59 條、約一萬字的《員工工作規則》(內容純屬虛構),Day 8 那 12 條原封不動成為第五章,10 個測試問題直接沿用(5 直白+5 口語),再加 5 題打向新章節,共 15 題。我還刻意埋了陷阱:幾條特別長的一定會被固定字數腰斬;「出勤」跟「請假」、「資安」跟「獎懲」高度相關,是天然混淆源。
固定字數: 每 300 字剁一刀,不管邊界。「補休」跟「六個月內休畢」
常被拆進兩塊,一塊裡還混著兩三條不相干的規定
固定+overlap:相鄰塊重疊 100 字,句子被腰斬時至少有一塊是完整的
依結構: 文件本來就有「章、條」結構,照邊界切,一條=一塊
切出來的規模:固定 34 塊、overlap 51 塊、依結構 59 塊。每塊都記下它在原文中的字元範圍——不是實作需要,是實驗需要,等下判定全靠它。(三種切法的完整實作見文末 GitHub。)
命中率:top-1 chunk 的字元範圍是否與答案條文重疊。沾到就算,刻意從寬。
純度:命中塊裡真正屬於答案條文的字元比例。「沾到就算」有個漏洞:一塊 300 字裡只有十幾個字是答案也照樣算命中——純度就是用來揭穿這種假命中的。
| 切法 | 命中率 | 命中題平均純度 |
|---|---|---|
| 固定字數 | 10/15 | 35% |
| 固定+overlap | 9/15 | 32% |
| 依結構 | 10/15 | 100% |
只看命中率:10、9、10,統計上就是雜訊,結論會是「切法沒差,隨便選」。攤開純度才看到差距。最誇張的 Q1(病假診斷證明):固定切法「命中」的是一塊橫跨五條規定的 300 字,屬於答案的只有開頭十幾個字,純度 6%;依結構切的 top-1 就是答案條文本人,純度 100%,相似度還更高。
殺傷力在下一步:檢索完是要把 chunk 塞進 prompt 給 LLM 的。塞進去是乾淨的一條規定還是五條大雜燴,直接決定生成品質跟 token 帳單。切法的代價不會消失,只是從「找不找得到」轉移到「找到的有多髒」——只量命中率,這筆代價就是隱形的。
| 你的情境 | 建議 | 要付的代價 |
|---|---|---|
| 文件有清楚結構(條文、標題、FAQ) | 依結構切 | 每種格式要寫自己的解析;口語查詢弱,靠 query 改寫補 |
| 文件沒結構(逐字稿、爬回來的網頁) | 固定+overlap | 塊數多、費用高、命中塊帶雜訊,參數要實測調 |
| 快速驗證可行性的 prototype | 固定字數 | 命中品質差,別直接上線 |
| 單條內容長到塞不下一塊 | 依結構切完再對超長塊二次切 | 實作複雜度上升(之後回來處理) |
共通原則只有一條:不管選哪種,先建一組測試問題,量命中率也量純度。
成本:三種切法各建一次索引加 15 題,全部 embedding 一次約 4 萬 tokens ≈ 新台幣 0.03 元。
命中率回答「找不找得到」,純度回答「找到的有多乾淨」——只看前者,你會選錯切法而且不自知。
你現在用的切法,量過純度嗎?歡迎留言聊聊。明天 Day 10:五萬塊向量還逐一算相似度就不行了,該讓向量資料庫上場。
Day 8 用「一條=一段」在 12 條語料上用 10 題拿到 70% 命中率;今天同樣 10 題在 59 條語料上,最好的切法也只剩 60% —— 語料變長、干擾變多,檢索難度不是線性上升的。
GitHub:https://github.com/wp900622/TrustRAG(day09_chunking/,含語料、三種切法實作、實驗腳本,clone 即可重現全部數字)